//显示对象选择模块（用到了ip核）
module display_sel_prj (
    clk,
    rst_n,
    state_c,
    op_1,
    op_2,
    result_neg,
    display,
    display_vld
 );
 parameter KEY_WID     = 4;
 parameter STATE_WID   = 5;
 parameter NUM_WID     = 27;	//IP核的设置 位宽27
 parameter SEG_NUM     = 8;
 parameter CNT_WID     = 4;
 parameter DIS_WID     = SEG_NUM*4;
 parameter OP_1        = 5'b00001;
 parameter OPER        = 5'b00010;
 parameter OP_2        = 5'b00100;
 parameter RESULT      = 5'b01000;
 parameter ERROR       = 5'b10000;
 
 input                       clk        ;	//时钟信号
 input                       rst_n      ;	//复位信号
 input    [STATE_WID-1:0]    state_c    ;	//工作状态指示信号
 input    [NUM_WID-1:0]      op_1       ;	//运算数1输出信号
 input    [NUM_WID-1:0]      op_2       ;	//运算数2输出信号
 //input    [NUM_WID-1:0]      result     ;
 input                       result_neg ; //运算结果符号信号
 
 output   [DIS_WID-1:0]      display     ;	//显示数据输出信号
 output                      display_vld ;	//显示数据有效指示信号
 //output   [CNT_WID-1:0]      div_rem_tmp ;
 reg      [DIS_WID-1:0]      display     ;
 reg                         display_vld ;
 reg                         result_neg_tmp;
 reg      [NUM_WID-1:0]      dis_sel;
 wire     [NUM_WID-1:0]      div_quo;
 reg      [NUM_WID-1:0]      dis_sel_tmp;
 wire     [CNT_WID-1:0]      div_rem;
 reg      [CNT_WID-1:0]      dis_cnt;
 wire     [NUM_WID-1:0]      dis_tmp;
 wire                        add_dis_cnt;
 wire                        end_dis_cnt;
 reg                         flag_add;

//寄存
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        result_neg_tmp <= 0;
    end
    else begin
        result_neg_tmp <= result_neg;
    end
end

always  @(*)begin
    if(state_c==OP_2)begin
        dis_sel = op_2; //状态选择运算数2
    end
    else begin
        dis_sel = op_1; //其他选择运算数1
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        dis_sel_tmp <= 0;
    end
    else begin
        dis_sel_tmp <= dis_sel;
    end
end

div div_prj(
            .clock      (clk        )   ,
            .numer      (dis_tmp    )   ,
            .denom      (10         )   ,
            .quotient   (div_quo    )   ,
            .remain     (div_rem    )
            );

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        flag_add <= 0;
    end
    else if(dis_sel!=dis_sel_tmp || result_neg!=result_neg_tmp)begin
        flag_add <= 1;
    end
    else if(end_dis_cnt)begin
        flag_add <= 0;
    end
end

//计数器
always @(posedge clk or negedge rst_n) begin
    if (rst_n==0) begin
        dis_cnt <= 0;
    end
    else if(add_dis_cnt) begin
        if(end_dis_cnt)
            dis_cnt <= 0;
        else
            dis_cnt <= dis_cnt+1 ;
   end
end
assign add_dis_cnt = flag_add && (dis_sel==dis_sel_tmp && result_neg==result_neg_tmp);
assign end_dis_cnt = add_dis_cnt  && dis_cnt == 10-1 ;


assign  dis_tmp = add_dis_cnt && dis_cnt==1 ? dis_sel : div_quo;

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        display <= 4'b0;
    end
    else if(state_c==ERROR)begin
        display[4*(dis_cnt)-1 -:4] <= 4'b1111;
    end
    else if(end_dis_cnt && result_neg==1 && state_c!=OP_2)begin
        display[31:28] <= 4'b1010;
    end
    else begin
        display[4*(dis_cnt-1)-1 -:4] <= div_rem;
    end
end



always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        display_vld <= 0;
    end
    else begin
        display_vld <= (dis_cnt==0 && (dis_sel==dis_sel_tmp)) ? 1'b1 : 1'b0;
    end
end

endmodule 

